/**
*@description 连接redis的方法，get set
*@author bokolin
*/
const redis = require('redis')
const { REDIS_PORT, REDIS_HOST } = require('../config/config')
//创建客户端
const redisClient = redis.createClient(REDIS_PORT, REDIS_HOST)
const token_expires = 60 * 60 * 24;	// 令牌的有效期为24小时
const captcha_expires = 60 * 5;// 验证码的有效期为5分钟
const default_expires_in = 60 * 3;	// 默认有效时间为30分钟
/**
 * @param {string} key hash总键
 * @param {string} field 键
 * @param {string} value 值
 * @param {number} expires 有效期 

 */


module.exports = {
	redisClient,
	// 封装命令为async
	///////////////////////////////////////////////////////////////////////////
	// 封装hget
	asyncHget: async function (key, field) {
		// key为整个hash类型的键
		let newKey = 'session:' + key;
		return new Promise((resolve, reject) => {
			redisClient.hget(newKey, field, function (err, res) {
				if (err)
					reject(err)
				else
					resolve(res)
			});
		})
	},
	// 封装hgetall
	asyncHgetall: async function (key) {
		// key为整个hash类型的键
		let newKey = 'session:' + key;
		return new Promise((resolve, reject) => {
			redisClient.hget(newKey, (err, res) => {
				if (err)
					reject(err)
				else
					resolve(res)
			});
		})
	},



	///////////////////////////////////////////////////////////////////////////
	
	// 保存 hash 值
	setHashVal: function (key, field, value, expires) {
		// key为整个hash类型的键
		let newKey = 'session:' + key;
		// 以键值对的形式进行保存
		redisClient.hset(newKey, field, value);
		// 如果没传过期时间，默认为token的过期时间
		redisClient.expire(newKey, expires || token_expires);
	},
	// 获取 hash 值
	getHashVal: async function (key, field) {
		// 如果有字段名，获取该字段名的值
		if (key)
			value = await this.asyncHget(key, field)
		// 如果没传字段名获取该hash整个key下面的key:value
		else
			value = await this.asyncHgetall(key)
		// 并且延长时间
		redisClient.expire(key, token_expires);
		return value;
	},
	// 删除 hash 值
	delHashVal: function (key, field) {
		return new Promise((resolve, reject) => {
			let newKey = 'session:' + key;
			if (field) {
				redisClient.hdel(newKey, field);
				resolve('success')
			} else {
				redisClient.del(newKey);
				resolve('success')
			}
			reject('error')
		})
	},
	// 是否存在hash
	isExistsHash: function (key) {
		return new Promise((resolve, reject) => {
			let newKey = 'session:' + key;
			redisClient.exists(newKey, (err, res) => {
				if (err) {
					reject(err)
				} else {
					resolve(res)
				}
			})
		})

	},
	// 更改用户 hash 值
	upHashVal: function(sid, name, value){
		let key = 'session:' + sid;
		redisClient.hset(key, name, value);
		// 延长过期时间
		redisClient.ttl(key, function(err, expiresIn){
			if (!err && expiresIn < default_expires_in)
				redisClient.expire(key, default_expires_in);
		})
	},
	// 延长到期时间
	delayExpires:function(key,time){
		let newKey = 'session:' + key;
		redisClient.expire(newKey, time );
	}
}